package epoch.db.agent;

import java.util.List;

import epoch.db.gamedb.Entity;

/**
 * 数据库代理，这层主要是对外提供访问入口
 * 
 * @author will
 * @date 2016年3月23日 下午2:43:16
 */
public interface IDbAgent {

	/**
	 * 获取类型
	 * @return
	 */
	int getType();

	/**
	 * 异步插入数据
	 * @param entity
	 */
	void insert(Entity entity);

	/**
	 * 异步更新数据
	 * @param entity
	 */
	void update(Entity entity);
	
	/**
	 * 异步更新或新增数据
	 * @param entity
	 */
	void saveOrUpdate(Entity entity);

	/**
	 * 批量插入
	 * 
	 * @param list
	 */
	 <T extends Entity> void insert(List<T> list);

	/**
	 * 执行sql命令
	 * 
	 * @param updateFieldAndCondition
	 *            更新列和条件
	 * @return 返回受影响的行数 int
	 */
	void update(String tableName, String updateFieldAndCondition, Object... params);

	/**
	 * 批量更新
	 * 
	 * @param list
	 */
	 <T extends Entity> void update(List<T> list);
	 
	/**
	 * 删除数据[异步]
	 * @param tableName
	 */
	void delete(String tableName, Object entityId);
	
	/**
	 * 批量删除数据[异步]
	 * @param tableName
	 */
	<K> void deleteList(String tableName, List<K> entityIds);

	/**
	 * 清空表[异步]
	 * @param entity 实体对象
	 */
	void deleteAll(String tableName);

	/**
	 * 根据主键查询
	 * @param tableName 表名
	 * @param entityId 主键值
	 * @return
	 */
	void findById(String tableName, Object entityId);
	
	/**
	 * 根据主键查询
	 * 
	 * @param tableName 表名
	 * @param columns 查询列 
	 * @param entityId 主键值
	 * @return
	 */
	void findById(String tableName, String[] columns, Object entityId);

	/**
	 * 查询第一个符合的记录
	 * 
	 * @param tableName 表名
	 * @param condition 查询条件表达式
	 * @param params 表达式参数
	 * @return 返回查询结果
	 */
	void findFirst(String tableName, String condition, Object... params);
	
	/**
	 * 查询第一个符合的记录
	 * 
	 * @param tableName 表名
	 * @param columns 查询列名
	 * @param condition 查询条件表达式
	 * @param params 表达式参数
	 * @return 返回查询结果{@code entity}
	 */
	void findFirst(String tableName, String[] columns, String condition, Object... params);

	/**
	 * 查询
	 * 
	 * @param tableName 表名
	 * @param condition 条件表达式
	 * @param params 参数值
	 * @return {@code List<Entity>}
	 */
	void find(String tableName, String condition, Object... params);
	
	/**
	 * 根据条件查询指定列数据
	 * 
	 * @param tableName 表名
	 * @param columns 查询列
	 * @param condition 条件表达式
	 * @param params 参数值
	 * 
	 * @return {@code List<Entity>}
	 */
	void find(String tableName, String[] columns, String condition, Object... params);
	
	/**
	 * 全表查询，无过滤条件，默认排序
	 * 
	 * @param tableName 表名
	 * @return 返回{@code list<entity> }
	 */
	void find(String tableName);

	/**
	 * 查询记录数
	 * 
	 * @param tableName
	 * @param condition
	 * @param params
	 * 
	 * @return 返回 int
	 */
	void queryCount(String tableName, String condition, Object... params);

	
	/**
	 * 执行sql命令
	 * 
	 * @param executeCommand sql命令
	 * @param params 参数值
	 * @return 返回受影响的行数 int
	 */
	void execute(String executeCommand, Object... params);

	/**
	 * 自由查询，主要在跨表查询时候使用，默认线程执行
	 * 
	 * @param queryCommand 查询命令
	 * @param params 参数值
	 * @return {@code List<Record> }
	 */
	void freeQuery(String queryCommand, Object... params);

	/**
	 * 自由查询, 主要在单表查询时使用，指定了表名，会根据表名称选择执行线程
	 * 
	 * @param tableName 表名[标记执行线程用]
	 * @param queryCommand 查询sql命令
	 * @param params 参数值
	 * @return {@code List<Record> }
	 */
	void freeQuery(String tableName, String queryCommand, Object... params);

	

}
